# D:\dazuoye\app\views\task1_trends.py

from flask import Blueprint, jsonify
from app.data_loader import time_series_data, radar_data
import pandas as pd
import ast
from sklearn.preprocessing import MinMaxScaler

# 1. 创建蓝图对象
task1_bp = Blueprint('task1_trends', __name__)


# 2. 在蓝图上注册路由
@task1_bp.route('/api/marketing/note_trends', methods=['GET'])
def get_note_trends():
    """
    API: 香调流行趋势时间序列图。
    新版逻辑：只返回每个月1号的数据，以减少数据量。
    """
    if time_series_data is None:
        return jsonify({"error": "数据未能加载"}), 500

    try:
        # 创建一个完整的、从头到尾的每日日期范围
        all_dates = pd.date_range(
            start=time_series_data['日期'].min(),
            end=time_series_data['日期'].max(),
            freq='D'
        )

        # 【新增】从完整的每日日期中，筛选出所有是“每月第一天”的日期
        monthly_dates = all_dates[all_dates.is_month_start]

        all_notes = sorted(time_series_data['主要香调'].unique())
        series_data = []

        for note in all_notes:
            note_data = time_series_data[time_series_data['主要香调'] == note]

            # 仍然基于完整的每日数据进行计算，保证数据的准确性
            note_series_daily = pd.Series(note_data['提及次数'].values, index=note_data['日期']).reindex(all_dates,
                                                                                                         fill_value=0)

            # 替换0值的逻辑保持不变
            non_zero_values = note_series_daily[note_series_daily > 0]
            if not non_zero_values.empty:
                mean_val = non_zero_values.mean()
                note_series_daily.replace(0, int(round(mean_val)), inplace=True)

            # 【修改】从处理好的每日序列中，只提取出每月第一天的数据
            note_series_monthly = note_series_daily[monthly_dates]

            series_data.append({
                "name": note,
                "data": note_series_monthly.astype(int).tolist()
            })

        # 【修改】返回筛选后的每月日期列表和对应的每月数据
        return jsonify({
            "dates": monthly_dates.strftime('%Y-%m-%d').tolist(),
            "series": series_data
        })

    except Exception as e:
        return jsonify({"error": f"处理香调趋势数据时出错: {e}"}), 500


# 【已按您的新要求修改】
@task1_bp.route('/api/marketing/preference_radar', methods=['GET'])
def get_preference_radar():
    """
    API: 消费者细分群体雷达图。
    新版逻辑：对每个群体的数据进行聚合，返回平均值。
    """
    if radar_data is None:
        return jsonify({"error": "雷达图数据未能加载"}), 500
    try:
        # --- 1. 数据解析和预处理 ---
        parsed_rows = []
        for _, row in radar_data.iterrows():
            try:
                factors_dict = ast.literal_eval(row['重要因素'])
                # '天然成分'分数取绝对值，其他负分视为0
                factors_dict['天然成分'] = abs(factors_dict.get('天然成分', 0))
                for key, value in factors_dict.items():
                    if key != '天然成分':
                        factors_dict[key] = max(0, value)

                temp_row = {'demographic': row['人口统计']}
                temp_row.update(factors_dict)
                parsed_rows.append(temp_row)
            except (ValueError, SyntaxError):
                continue

        if not parsed_rows:
            return jsonify({"indicators": [], "series": []})

        # --- 2. 按人群分组并计算平均值 ---
        df = pd.DataFrame(parsed_rows)
        df_agg = df.groupby('demographic').mean().reset_index()

        # --- 3. 数据归一化 (Min-Max Scaling) ---
        factor_columns = [col for col in df_agg.columns if col != 'demographic']
        scaler = MinMaxScaler(feature_range=(0, 100))
        # 对所有平均值进行拟合和转换
        df_agg[factor_columns] = scaler.fit_transform(df_agg[factor_columns])

        # --- 4. 格式化为JSON输出 ---
        indicators = [{"name": "对非天然成分的顾虑度" if col == '天然成分' else col} for col in factor_columns]

        processed_series = []
        for _, row in df_agg.iterrows():
            processed_series.append({
                "name": row['demographic'],
                "value": [round(val, 2) for val in row[factor_columns]]
            })

        return jsonify({"indicators": indicators, "series": processed_series})

    except Exception as e:
        return jsonify({"error": f"处理雷达图数据时出错: {str(e)}"}), 500